#pragma once

#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <list>
#include <mutex>
#include <queue>
#include <memory>

using namespace std;

#define     TEST_TEMPLATE           0

namespace TempLate
{
    /**
     * @brief The TaskQueue class          模板类
     */
    template<typename T>
    class TaskQueue
    {
    public:
        TaskQueue(){}
        ~TaskQueue(){}

        /**
         * @brief empty         队列是否为空
         * @return
         */
        bool empty()
        {
            std::lock_guard<std::mutex> lockguard(m_mutex);
            return m_queue.empty();
        }

        /**
         * @brief size          队列大小
         * @return
         */
        int size()
        {
            std::lock_guard<std::mutex> lockguard(m_mutex);
            return m_queue.size();
        }

        /**
         * @brief pushQueue     数据入栈
         * @param t
         * @return
         */
        void pushQueue(T &t)
        {
            std::lock_guard<std::mutex> lockguard(m_mutex);
            m_queue.emplace(t);
        }

        /**
         * @brief popQueue      数据出栈
         * @param t
         * @return
         */
        bool popQueue(T &t)
        {
            std::lock_guard<std::mutex> lockguard(m_mutex);
            if ( m_queue.empty() )
                return false;

            t = std::move(m_queue.front());     // 取出队首元素，返回队首元素值，并进行右值引用

            m_queue.pop();          // 删除队列首元素
            return true;
        }

    private:
        mutex m_mutex;              // 互斥锁
        queue<T> m_queue;           // 存放任务的队列
    };
}
